home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / libg_261.zip / libg_261 / libg++ / gperf / ChangeLog next >
Text File  |  1994-10-18  |  56KB  |  1,200 lines

  1. Tue Oct 18 17:51:14 1994  Per Bothner  <bothner@kalessin.cygnus.com>
  2.  
  3.     * src/std-err.cc:  Use stderror, instead of the non-standard
  4.     sys_nerr and sys_errlist.
  5.  
  6. Sat Sep 17 22:02:13 1994  Per Bothner  (bothner@kalessin.cygnus.com)
  7.  
  8.     * src/key-list.cc (output_hash_function):
  9.     Patch from William Bader <wbader@CSEE.Lehigh.Edu>.
  10.  
  11. Fri Jul 15 09:38:11 1994  Per Bothner  (bothner@cygnus.com)
  12.  
  13.     * src/std-err.cc:  #include <errno.h>, and only declare
  14.     extern int errno if errno is not a macro.
  15.  
  16. Mon May 30 17:29:34 1994  Per Bothner  (bothner@kalessin.cygnus.com)
  17.  
  18.     * Makefile.in (src_all, install):  Make sure to add '/' after
  19.     `pwd` in $rootme, as expected by FLAGS_TO_PASS.
  20.  
  21. Wed May 11 00:47:22 1994  Jason Merrill  (jason@deneb.cygnus.com)
  22.  
  23.     Make libg++ build with gcc -ansi -pedantic-errors
  24.     * src/options.h: Lose commas at end of enumerator lists.
  25.  
  26. Sun Dec  5 19:16:40 1993  Brendan Kehoe  (brendan@lisa.cygnus.com)
  27.  
  28.     * src/hash-table.cc (Hash_Table::~Hash_Table): Don't pass an
  29.     argument to fprintf, since it's not expecting one.
  30.  
  31. Fri Nov 26 19:03:18 1993  Per Bothner  (bothner@kalessin.cygnus.com)
  32.  
  33.     * src/list-node.cc:  #undef index, for the sake of broken NeXT,
  34.  
  35. Thu Nov  4 11:16:03 1993  Per Bothner  (bothner@kalessin.cygnus.com)
  36.  
  37.     * Makefile.in (install):  Use INSTALL_DATA for gperf.1.
  38.  
  39. Mon Oct 25 18:40:51 1993  Per Bothner  (bothner@kalessin.cygnus.com)
  40.  
  41.     * src/key-list.cc (Key_List::read_keys):  Use POW macro
  42.     to increase hash table size to power of 2.
  43.  
  44.     * options.h (LARGE_STACK_ARRAYS):  New flag.  Defaults to zero.
  45.     * gen-perf.cc, key-list.cc, read-line.cc:    
  46.     Only stack-allocate large arrays if LARGE_STACK_ARRAYS is set.
  47.     * main.cc (main):  Only call setrlimit (RLIMIT_STACK, ...)
  48.     if LARGE_STACK_ARRAYS.
  49.  
  50. Mon Oct  4 17:45:08 1993  Per Bothner  (bothner@kalessin.cygnus.com)
  51.  
  52.     * src/gen-perf.cc:  Always use ANSI rand/srand instead of BSDisms.
  53.  
  54. Wed Aug 18 12:19:53 1993  Per Bothner  (bothner@kalessin.cygnus.com)
  55.  
  56.     * Makefile.in (src_all):  Make less verbose output.
  57.  
  58. Fri May 28 14:01:18 1993  Per Bothner  (bothner@rtl.cygnus.com)
  59.  
  60.     * src/gen-perf.cc (Gen_Perf::change):  Don't use gcc-specific
  61.     2-operand conditional expression.
  62.     * src/key-list.cc (Key_List::output_lookup_array):
  63.     Don't use variable-size stack arrays, unless compiled by g++.
  64.  
  65. Tue May  4 14:08:44 1993  Per Bothner  (bothner@cygnus.com)
  66.  
  67.     Changes (mostly from Peter Schauer) to permit compilation
  68.     using cfront 3.0 and otherwise be ARM-conforming.
  69.     * src/key-list.h:  class Key_List must use public derivation
  70.     of base class Std_Err (because Gen_Perf::operator() in gen-perf.cc
  71.     calls Std_Err::report_error).
  72.     * src/gen-perf.cc (Gen_Perf::affects_prev), src/hash-table.cc
  73.     (Hash_Table::operator()):  Don't use gcc-specific 2-operand
  74.     conditional expression.
  75.     * src/iterator.cc (Iterator::operator()):  Don't use gcc-specific
  76.     range construct in case label.
  77.     * key-list.cc (Key_List::output_lookup_array, Key_List::read_keys),
  78.     src/gen-perf.cc (Gen_Perf::operator(), src/read-line.cc
  79.     (Read_Line::readln_aux):  If not gcc, don't allocate
  80.     variable-sized arrays on stack.
  81.     * src/new.cc (operator new):  Argument type should be size_t.
  82.     * key-list.cc (Key_List::output_lookup_array, Key_List::read_keys),
  83.     new/cc (::operator new): Don't use non-standard >?= operator.
  84.  
  85. Tue Apr 27 20:11:30 1993  Per Bothner  (bothner@cygnus.com)
  86.  
  87.     * src/Makefile.in:  Define TARGETPROG, and use it.
  88.  
  89. Mon Apr 19 00:29:18 1993  Per Bothner  (bothner@cygnus.com)
  90.  
  91.     * Makefile.in, configure.in:  Re-vamped configure scheme.
  92.     * gperf.texinfo:  Renamed to gperf.texi.
  93.     * src/bool-array.{h,cc}:  ANSIfy bzero->memset.
  94.  
  95. Sat Jan 30 20:21:28 1993  Brendan Kehoe  (brendan@lisa.cygnus.com)
  96.  
  97.     * tests/Makefile.in (mostlyclean): Also delete aout, cout, m3out,
  98.     pout, and preout.
  99.  
  100. Tue Dec 29 08:58:17 1992  Ian Lance Taylor  (ian@cygnus.com)
  101.  
  102.     * Makefile.in: pass $(FLAGS_TO_PASS) to all calls to make.
  103.     (FLAGS_TO_PASS): added INSTALL, INSTALL_DATA, INSTALL_PROGRAM.
  104.  
  105. Mon Dec 21 18:46:46 1992  Per Bothner  (bothner@rtl.cygnus.com)
  106.  
  107.     * tests/expected.* renamed to *.exp to fit in 14 chars.
  108.     * tests/Makefile.in:  Update accordingly.
  109.     Also rename output.* to *.out.
  110.     * src/Makefile.in (clean):  Remove gperf program.
  111.  
  112. Wed Dec  9 14:33:34 1992  Per Bothner  (bothner@cygnus.com)
  113.  
  114.     * src/hash-table.cc, src/bool-array.h: ANSIfy bzero->memset.
  115.  
  116. Thu Dec  3 19:34:12 1992  Per Bothner  (bothner@cygnus.com)
  117.  
  118.     * Makefile.in (distclean, realclean): Don't delete
  119.     Makefile before recursing.
  120.  
  121. Fri Nov  6 13:41:49 1992  Per Bothner  (bothner@rtl.cygnus.com)
  122.  
  123.     * key-list.{h,cc}:  Remove MAX_INT (and similar) constant
  124.     fields from Key_List class, and use INT_MAX (etc) from limits.h.
  125.     * key-list.{h,cc}, options.{h,cc}, vectors.h:  Removed all
  126.     uses of initialized const fields, as they are non-standard
  127.     - and their use was easy to do away with.  Mostly, just
  128.     made the constants static non-fields in the .cc file.
  129.  
  130. Mon Nov  2 13:10:11 1992  Per Bothner  (bothner@cygnus.com)
  131.  
  132.     * tests/Makefile.in:  When generating cinset.c, don't pass -C,
  133.     since -C assumes an ANSI compiler.  Add the -C flag (with -a)
  134.     when generating test.out.3 instead.
  135.     * tests/expected.out.3:  Update accordingly.
  136.  
  137. Wed Aug 12 11:47:54 1992  Per Bothner  (bothner@cygnus.com)
  138.  
  139.     * Makefile.in:  Factor out common flags into $(FLAGS_TO_PASS).
  140.     * Makefile.in:  'install-info' depends on gperf.info.
  141.  
  142. Mon Aug 10 11:39:52 1992  Ian Lance Taylor  (ian@dumbest.cygnus.com)
  143.  
  144.     * Makefile.in, src/Makefile.in: always create installation
  145.     directories.
  146.  
  147. Mon Jul 20 15:33:21 1992  Mike Stump  (mrs@cygnus.com)
  148.  
  149.     * src/new.cc (operator new):  Add cast from void * to char *,
  150.     since it is not a standard conversion.
  151.  
  152. Wed Jun 17 16:25:30 1992  Per Bothner  (bothner@rtl.cygnus.com)
  153.  
  154.     * src/gen-perf.cc:  #include <_G_config.h> for _G_SYSV.
  155.     * src/key-list.cc:  alloca() hair.
  156.     * src/main.cc (main):  Only call getrlimit if _G_HAVE_SYS_RESOURCE.
  157.     * Makefile,in, {src,test}/Makefile.in:  Fix *clean rules.
  158.  
  159. Fri May 29 13:21:13 1992  Per Bothner  (bothner@rtl.cygnus.com)
  160.  
  161.     * src/gen-perf.cc:  Replace USG -> _G_SYSV.
  162.  
  163. Thu May 14 13:58:36 1992  Per Bothner  (bothner@rtl.cygnus.com)
  164.  
  165.     * src/Makefile.in:  Don't pass obsolete flag -DUNLIMIT_STACK.
  166.     * tests/Makefile.in (clean): Fix.
  167.  
  168. Sat Mar  7 00:03:56 1992  K. Richard Pixley  (rich@rtl.cygnus.com)
  169.  
  170.     * gperf.texinfo: added menu item hook.
  171.  
  172. Wed Feb 26 18:04:40 1992  K. Richard Pixley  (rich@cygnus.com)
  173.  
  174.     * Makefile.in, configure.in: removed traces of namesubdir,
  175.       -subdirs, $(subdir), $(unsubdir), some rcs triggers.  Forced
  176.       copyrights to '92, changed some from Cygnus to FSF.
  177.  
  178. Sun Jan 26 19:21:58 1992  Per Bothner  (bothner at cygnus.com)
  179.  
  180.     * tests/Makefile.in:  Use re-directed stdin instead of file
  181.     name in argv.  This allows us to remove the filename
  182.     from the output, the expected output, and hence the diffs.
  183.     (Note that the input file is in $(srcdir), which we cannot
  184.     place in the expected out files.)
  185.     * tests/expected.out.[1235]:  Edit out input filename,
  186.     to match new output.
  187.  
  188. Thu Jun 28 16:17:27 1990  Doug Schmidt  (schmidt at brilliant)
  189.  
  190.     * Wow, first fix on the new job!  There was a dumb error
  191.       in Key_List::output_lookup_function, where I printed the
  192.       string "&wordlist[key]" instead of the correct "&wordlist[index]".
  193.       
  194.     * Added a couple of #ifdefs for USG support.
  195.           
  196. Sun Jun  3 17:16:36 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  197.  
  198.         * Updated the version number to 2.5 and sent to Doug Lea for release
  199.           with the latest GNU libg++.
  200.  
  201.         * Changed the error handling when a keyword file cannot be opened
  202.           (now calls perror).
  203.  
  204. Wed May 30 14:49:40 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  205.  
  206.         * Instrumented the source code with trace statements automagically
  207.           inserted using my new automated trace instrumentation tool!
  208.  
  209. Wed May  9 11:47:41 1990  Doug Schmidt  (schmidt at siam.ics.uci.edu)
  210.  
  211.         * Really fixed the previous bug.  Turns out that a small amount
  212.           of logic had to be duplicated to handle static links that occur
  213.           as part of dynamic link chains.  What a pain!!!
  214.  
  215. Tue May  8 23:11:44 1990  Doug Schmidt  (schmidt at siam.ics.uci.edu)
  216.  
  217.         * Fixed a stupid bug in Key_List::output_lookup_array that was
  218.           causing incorrect counts to be generated when there were both
  219.           static and dynamic links occurring for the same hash value.
  220.           Also simplified the code that performs the logic in this routine.
  221.  
  222. Mon Apr 30 17:37:24 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  223.  
  224.         * Fixed stupid bug in Key_List::output_lookup_array that was
  225.           making the generated lookup[] array contain `chars' even
  226.           when the values stored in the chars are greater than 127!
  227.  
  228.         * Changed the behavior of the -G (global table) option so that it
  229.           will output the `length[]' array in the global scope along with
  230.           the `word_list[]' array.
  231.  
  232.         * Fixed a stupid bug in Key_List::output_lookup_function that
  233.           would always output the complicated `duplicate-handling' lookup
  234.           logic, even when there were no duplicates in the input!
  235.  
  236.         * Yikes, had to modify a bunch of stuff in key-list.cc to correctly
  237.           handle duplicate entries.  Changed the generated code so that
  238.           the MIN_HASH_VALUE is no longer subtracted off when calculating
  239.           the hash value for a keyword.  This required changing some other
  240.           code by substituting MAX_HASH_VALUE for TOTAL_KEYS in several places.
  241.           Finally, this means that the generated tables may contain leading 
  242.           null entries, but I suppose it is better to trade-off space to get 
  243.           faster performance...
  244.  
  245. Mon Mar 26 13:08:43 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  246.  
  247.         * Updated version number to 2.4 to reflect the latest changes.
  248.  
  249.         * Changed the main program so that it always prints out gperf's
  250.           execution timings to the generated output file.
  251.           
  252. Sun Mar 25 12:39:30 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  253.  
  254.         * Added the -Z option so that users can specify the name of the
  255.           generated class explicitly.  Updated documentation to reflect
  256.           this change.
  257.           
  258.         * Modified the generated C++ class interface so that the functions
  259.           are declared static (to remove the overhead of passing the `this'
  260.           pointer).  This means that operator()() can no longer be used,
  261.           since it only works on non-static member functions.
  262.           Also changed things so that there is no constructor (why waste
  263.           the extra call, when it doesn't do anything, eh?)
  264.  
  265.         * Modified the behavior of Key_List::output when the -L C++ option
  266.           is enabled.  Previously the code generated use const data members
  267.           to record MIN_WORD_LENGTH, MIN_HASH_VALUE, etc.  However, as
  268.           pointed out by James Clark this may result in suboptimal behavior
  269.           on the part of C++ compilers that can't inline these values.
  270.           Therefore, the new behavior is identical to what happens with
  271.           -L C, i.e., either #defines or function-specific enums are used.
  272.           Why sacrifice speed for some abstract notion of `code purity?' ;-)
  273.  
  274. Tue Mar  6 18:17:42 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  275.  
  276.         * Added the -E option that defines constant values using an enum
  277.           local to the lookup function rather than with #defines.  This
  278.           also means that different lookup functions can reside in the
  279.           same file.  Thanks to James Clark (jjc@ai.mit.edu). 
  280.  
  281. Sat Mar  3 20:19:00 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
  282.  
  283.         * Added a special case to key_list::output_switch that doesn't
  284.           generate extra comparisons when the `-S' is given an argument
  285.           of 1 (the normal case).  This should speed up the generated
  286.           code output a tad...
  287.  
  288. Fri Feb 23 14:21:28 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
  289.  
  290.         * Renamed all instances of member function get_keysig_size
  291.           to get_max_keysig_size, since this is more precise...
  292.  
  293.         * Changed all occurrences of charset to keysig (stands for ``key
  294.           signature'') to reflect the new naming convention used in the 
  295.           USENIX paper.
  296.  
  297. Thu Feb 22 11:28:36 1990  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  298.  
  299.         * Changed the name of the generated associated values table from
  300.           asso_value to asso_values to reflect conventions in the USENIX
  301.           C++ paper.
  302.  
  303. Thu Feb 15 23:29:03 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
  304.  
  305.         * Updated the gperf.texinfo file to fix some formatting problems
  306.           that had crept in since last time.
  307.  
  308. Wed Feb 14 23:27:24 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
  309.  
  310.         * Fixed stupid bug in key-list.cc (get_special_input), wher
  311.           gperf replaced each '%' with the succeeding character.
  312.  
  313.         * Added support for multiple target language generation.  Currently
  314.           handled languages are C and C++, with C as the default.  Updated
  315.           documentation and option handler to reflect the changes.
  316.  
  317.         * Added a global destructor to new.cc and removed the #ifdef, since
  318.           the bloody thing now works with libg++.
  319.  
  320. Mon Feb 14 13:00:00 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
  321.  
  322.         * Found out that my gperf paper was accepted at the upcoming
  323.           USENIX C++ Conference in San Francisco.  Yow!
  324.  
  325. Tue Jan 30 09:00:29 1990  Doug Schmidt  (schmidt at zola.ics.uci.edu)
  326.  
  327.         * #ifdef'd out the new.cc memory allocator, since there are
  328.           problems with this and the libg++ stuff.
  329.  
  330.         * Changed key-list.h so that class Vectors is a public (rather
  331.           than private) base class for class Key_List.  The previous
  332.           form was illegal C++, but wasn't being caught by the old
  333.           g++ compiler.  Should work now... ;-)
  334.  
  335. Sun Dec 10 14:08:23 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  336.  
  337.         * Added several changes from rfg@ics.uci.edu.  These changes
  338.           help to automate the build process.
  339.  
  340. Wed Nov 15 15:49:33 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
  341.  
  342.         * Removed conditional compilation for GATHER_STATISTICS.  There's
  343.           really no good reason to avoid collecting this info at run-time,
  344.           since that section of code is *hardly* the bottleneck... ;-)
  345.  
  346.         * Simplified the C output routines in Key_List::set_output_types
  347.           and Key_List::output_keyword_table a bit in order to
  348.           speed-up and clean up the code generation.
  349.  
  350.         * Modified function Key_List::get_special_input so that it does
  351.           not try to `delete' a buffer that turned out to be too short.
  352.           This is important since the new memory management scheme
  353.           does not handle deletions.  However, adding a small amount of
  354.           garbage won't hurt anything, since we generally don't do this
  355.           operation more than a couple times *at most*!
  356.  
  357.         * Created a new file (new.cc) which includes my own overloaded
  358.           operator new.  This function should dramatically reduce the
  359.           number of calls to malloc since it grabs large chunks and
  360.           doles them out in small pieces.  As a result of this change
  361.           the class-specific `operator new' was removed from class List_Node.
  362.  
  363. Tue Nov 14 21:45:30 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  364.  
  365.         * Continued to refine the great hack.  The latest trick is to
  366.           try and replace most uses of dynamic memory (i.e., calls to
  367.           new) with uses of gcc dynamic arrays (i.e., an alloca solution).
  368.           This makes life much easier for the overall process-size, since 
  369.           it reduces the amount of overhead for memory management.  As a
  370.           side-effect from this change there is no reason to have the
  371.           Bool_Array::dispose member function, so it's outta here!
  372.  
  373.         * Fixed a stupid bug that was an disaster waiting to happen...
  374.           Instead of making the boolean array large enough to index
  375.           max_hash_value it was only large enough to index max_hash_value
  376.           - 1.  Once again, an off-by-one mistake in C/C++!!!!
  377.  
  378. Mon Nov 13 19:38:27 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  379.  
  380.         * Added the final great hack!  This allows us to generate hash tables
  381.           for near-perfect hash functions that contain duplicates, *without*
  382.           having to use switch statements!  Since many compilers die on large
  383.           switch statements this feature is essential.  Furthermore, it appears
  384.           that the generated code is often *smaller* than that put out by
  385.           compilers, even though a large, sparse array must be created.
  386.           Here's the general idea:
  387.  
  388.              a. Generate the wordlist as a contiguous block of keywords, 
  389.                 just as before when using a switch statement.  This
  390.                 wordlist *must* be sorted by hash value. 
  391.  
  392.              b. Generate the lookup array, which is an array of signed
  393.                 {chars,shorts,ints}, (which ever allows full coverage of
  394.                 the wordlist dimensions).  If the value v, where v =
  395.                 lookup[hash(str,len)], is >= 0 and < TOTAL_KEYWORDS, then we
  396.                 simply use this result as a direct access into the wordlist 
  397.                 array to snag the keyword for comparison.  
  398.  
  399.              c. Otherwise, if v is < -TOTAL_KEYWORDS or > TOTAL_KEYWORDS
  400.                 this is an indication that we'll need to search through
  401.                 some number of duplicates hash values.  Using a hash
  402.                 linking scheme we'd then index into a different part of
  403.                 the hash table that provides the starting index and total
  404.                 length of the duplicate entries to find via linear search!
  405.  
  406. Sun Nov 12 13:48:10 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
  407.  
  408.         * Simplified Key_List::output_min_max considerably by recognizing
  409.           that since the keyword list was already sorted by hash value finding 
  410.           the min and max values is trivial!
  411.  
  412.         * Improved the debugging diagnostics considerably in classes Key_List,
  413.           Hash_Table, and Gen_Perf.
  414.  
  415.         * Modified the `-s' option so that a negative argument is now 
  416.           interpreted to mean `allow the maximum associated value to be
  417.           about x times *smaller* than the number of input keys.'  This
  418.           should help prevent massive explosion of generated hash table
  419.           size for large keysets.
  420.  
  421. Sat Nov 11 11:31:13 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  422.  
  423.         * Added a field in class Key_List that counts the total number
  424.           of duplicate keywords, both static and dynamic.
  425.  
  426.         * Added a new member function Bool_Array that deletes the dynamic
  427.           memory allocated to Bool_Array::storage_array.  This space may
  428.           be needed for subsequent options, so it made sense to free it as
  429.           soon as possible...
  430.           
  431.         * Renamed file/class Alpha_Vectors to Vectors, to avoid problems
  432.           with 14 character length filenames on SYSV.  Also changed file
  433.           adapredefined.gperf to adadefs.gperf in the ./tests directory.
  434.  
  435.         * Modified class Options by changing the member function
  436.           Options::total_positions to Options::get_charset_size and
  437.           Options::set_charset_size.  These two routines now either return
  438.           the total charset size *or* the length of the largest keyword
  439.           if the user specifies the -k'*' (ALLCHARS) option.  This change
  440.           cleans up client code.
  441.  
  442.         * Merged all the cperf changes into gperf.
  443.         
  444.         * Made sure to explicitly initialize perfect.fewest_collisions to
  445.           0.
  446.  
  447.         * Cleaned up some loose ends noticed by Nels Olson.
  448.           1.  Removed `if (collisions <= perfect.fewest_collisions)'
  449.               from Gen_Perf::affects_prev since it was superfluous.
  450.           2.  Removed the fields best_char_value and best_asso_value
  451.               from Gen_Perf.  There were also unnecessary.
  452.           3.  Fixed a braino in the Bool_Array::bool_array_reset
  453.               function.  Since iteration numbers can never be zero
  454.               the `if (bool_array.iteration_number++ == 0)' must be
  455.               `if (++bool_array.iteration_number == 0).'
  456.           4.  Modified Std_Err::report_error so that it correctly handles
  457.               "%%".
  458.  
  459.         * It is important to note that -D no longer enables -S.
  460.           There is a good reason for this change, which will become
  461.           manifested in the next release... (suspense!).
  462.  
  463.         * Made some subtle changes to Key_List::print_switch so that if finally
  464.           seems to work correctly.  Needs more stress testing, however...
  465.  
  466.         * Made a major change to the Key_List::print_switch function.
  467.           The user can now specify the number of switch statements to generate
  468.           via an argument to the -S option, i.e., -S1 means `generate 1
  469.           switch statement with all keywords in it,' -S2 means generate
  470.           2 switch statements with 1/2 the elements in each one, etc.
  471.           Hopefully this will fix the problem with C compilers not being
  472.           able to generate code for giant switch statements (but don't
  473.           hold your breath!)
  474.  
  475.         * Changed Key_List::length function to Key_List::keyword_list_length.
  476.  
  477.         * Added a feature to main.c that prints out the starting wall-clock
  478.           time before the program begins and prints out the ending wall-clock
  479.           time when the program is finished.
  480.  
  481.         * Added the GATHER_STATISTICS code in hash-table.c so we can
  482.           keep track of how well double hashing is doing.  Eventually,
  483.           GATHER_STATISTICS will be added so that all instrumentation
  484.           code can be conditionally compiled in.
  485.  
  486.         * Fixed a stupid bug in Key_List::print_switch routine.  This
  487.           was necessary to make sure the generated switch statement worked
  488.           correctly when *both* `natural,' i.e., static links and dynamic
  489.           links, i.e., unresolved duplicates, hash to the same value.
  490.  
  491.         * Modified Bool_Array::~Bool_Array destructor so that
  492.           it now frees the bool_array.storage_array when it is no longer
  493.           needed.  Since this array is generally very large it makes sense
  494.           to return the memory to the freelist when it is no longer in use.
  495.  
  496.         * Changed the interface to constructor Hash_Table::Hash_Table.  This 
  497.           constructor now passed a pointer to a power-of-two sized buffer that 
  498.           serve as storage for the hash table.  Although this weakens information
  499.           hiding a little bit it greatly reduces dynamic memory fragmentation,
  500.           since we can now obtain the memory via a call to alloca, rather
  501.           than malloc.  This change modified Key_List::read_keys calling
  502.           interface.
  503.  
  504.         * Since alloca is now being used more aggressively a conditional
  505.           compilation section was added in main.c. Taken from GNU GCC,
  506.           this code gets rid of any avoidable limit on stack size so that
  507.           alloca does not fail.  It is only used if the -DRLIMIT_STACK
  508.           symbol is defined when gperf is compiled. 
  509.  
  510.         * Added warnings in option.c so that user's would be informed
  511.           that -r superceeds -i on the command-line.
  512.           
  513.         * Rewrote Gen_Perf::affects_prev.  First, the code structure
  514.           was cleaned up considerably (removing the need for a dreaded
  515.           goto!).  Secondly, a major change occurred so that Gen_Perf::affects_prev
  516.           returns FALSE (success) when fewest_hits gets down to whatever
  517.           it was after inserting the previous key (instead of waiting for
  518.           it to reach 0).  In other words, it stops trying if it can
  519.           resolve the new collisions added by a key, even if there are
  520.           still other old, unresolved collisions.  This modification was
  521.           suggested by Nels Olson and seems to *greatly* increase the
  522.           speed of gperf for large keyfiles.  Thanks Nels!
  523.  
  524.         * In a similar vein, inside the Gen_Perf::change routine 
  525.           the variable `perfect.fewest_collisions is no longer initialized
  526.           with the length of the keyword list.  Instead it starts out at
  527.           0 and is incremented by 1 every time change () is called.
  528.           The rationale for this behavior is that there are times when a
  529.           collision causes the number of duplicates (collisions) to
  530.           increase by a large amount when it would presumably just have
  531.           gone up by 1 if none of the asso_values were changed.  That is,
  532.           at the beginning of change(), you could initialize fewest_hits
  533.           to 1+(previous value of fewest_hits) instead of to the number of
  534.           keys.  Thanks again, Nels.
  535.  
  536.         * Replaced alloca with new in the Gen_Perf::change function.
  537.           This should eliminate some overhead at the expense of a little
  538.           extra memory that is never reclaimed.
  539.  
  540.         * Renamed Gen_Perf::merge_sets to Gen_Perf::compute_disjoint_union
  541.           to reflect the change in behavior.
  542.  
  543.         * Added the -e option so users can supply a string containing
  544.           the characters used to separate keywords from their attributes.
  545.           The default behavior is ",\n".
  546.  
  547.         * Removed the char *uniq_set field from LIST_NODE and modified
  548.           uses of uniq_set in perfect.c and keylist.c.  Due to changes
  549.           to Gen_Perf::compute_disjoint_sets this field was no longer
  550.           necessary, and its removal makes the program smaller and
  551.           potentially faster. 
  552.           
  553.         * Added lots of changes/fixes suggested by Nels Olson
  554.           (umls.UUCP!olson@mis.ucsf.edu).  In particular:
  555.           1.  Changed Bool_Array so that it would dynamically create
  556.               an array of unsigned shorts rather than ints if the 
  557.               LO_CAL symbol was defined during program compilation.
  558.               This cuts the amount of dynamic memory usage in half,
  559.               which is important for large keyfile input.
  560.           2.  Added some additional debugging statements that print extra
  561.               info to stderr when the -d option is enabled.
  562.           3.  Fixed a really stupid bug in Key_List::print_switch
  563.               A right paren was placed at the wrong location, which broke
  564.               strlen ().
  565.           4.  Fixed a subtle problem with printing case values when keylinks
  566.               appear.  The logic failed to account for the fact that there
  567.               can be keylinks *and* regular node info also!
  568.           5.  Changed the behavior of Key_List::read_keys so that it would
  569.               honor -D unequivocally, i.e., it doesn't try to turn off dup
  570.               handling if the user requests it, even if there are no
  571.               immediate links in the keyfile input. 
  572.           6.  Modified the -j option so that -j 0 means `try random values
  573.               when searching for a way to resolve collisions.'
  574.           7.  Added a field `num_done' to the Gen_Perf struct.  This is used
  575.               to report information collected when trying to resolve
  576.               hash collisions.
  577.           8.  Modified the merge_sets algorithm to perform a disjoint
  578.               union of two multisets.  This ensures that subsequent
  579.               processing in Gen_Perf::affect_prev doesn't
  580.               waste time trying to change an associated value that is
  581.               shared between two conflicting keywords.
  582.           9.  Modified Gen_Perf::affects_prev so that it doesn't try
  583.               random jump values unless the -j 0 option is enabled.
  584.           10. Fixed a silly bug in Gen_Perf::change.  This problem caused
  585.               gperf to seg fault when the -k* option was given and the
  586.               keyfile file had long keywords.
  587.         
  588. Sun Oct 29 00:18:55 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
  589.  
  590.         * Modified class-specific new operations for Read_Line and
  591.           List_Node so they don't fail if SIZE is larger than twice
  592.           the previous buffer size.  Note we double buffer size
  593.           everytime the previous buffer runs out, as a heuristic
  594.           to reduce future calls to malloc.
  595.  
  596. Sun Oct 22 13:49:43 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  597.  
  598.         * Updated gperf version number to 2.0.  Send to Doug Lea for
  599.           incorporation into the long-awaited `official' libg++ 1.36
  600.           release! 
  601.  
  602.         * Thanks to Nels Olson a silly bug in Gen_Perf::change ()
  603.           was fixed.  This problem caused gperf to seg fault when
  604.           the -k* option was given and the keyfile file had long
  605.           keywords.
  606.           
  607.         * Modified Key_List::print_hash_function so that it output
  608.           max_hash_value + 1 (rather than just max_hash_value) for
  609.           any associated value entries that don't correspond to
  610.           keyword charset characters.  This should speed up rejection
  611.           of non-keyword strings a little in some cases.
  612.  
  613. Sat Oct 21 19:28:36 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  614.  
  615.         * Fixed Key_List::print_hash_function so that it no longer output
  616.           things like `return 0 + ...'  Although this probably gets
  617.           optimized away by even the worst C compilers there isn't any
  618.           point tempting fate... ;-)
  619.  
  620.         * Fixed class List_Node's constructor so that it wouldn't a priori
  621.           refuse to consider trying to hash keys whose length is less
  622.           than the smallest user-specified key position.  It turns out
  623.           this is not a problem unless the user also specifies the -n
  624.           (NOLENGTH) option, in which case such keys most likely
  625.           don't have a prayer of being hashed correctly!
  626.  
  627.         * Changed the name of the generated lookup table from `Hash_Table'
  628.           to `asso_value' to be consistent with the gperf paper.
  629.  
  630. Tue Oct 17 14:19:48 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  631.  
  632.         * Added a flag GATHER_STATISTICS in the Makefile.  If defined
  633.           during compilation this turns on certain collection facilities
  634.           that track the performance of gperf during its execution.  In
  635.           particular, I want to see how many collisions occur for the
  636.           double hashing Hash_Table.
  637.  
  638.         * Added a safety check so that we don't screw up if the total
  639.           number of `resets' of the Bool_Array exceeds MAX_INT.  Since
  640.           this number is around 2^31 it is unlikely that this would ever
  641.           occur for most input, but why take the risk?
  642.  
  643.         * Changed the behavior for the -a (ANSI) option so that the
  644.           generated prototypes use int rather than size_t for the LEN 
  645.           parameter.  It was too ugly having to #include <stddef.h> all
  646.           over the place...
  647.  
  648. Mon Oct 16 11:00:35 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  649.  
  650.         * Continued to work on the gperf paper for the USENIX C++
  651.           conference.  At some point this will be merged back into
  652.           the gperf documentation...
  653.  
  654. Sat Oct 14 20:29:43 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
  655.  
  656.         * Added a majorly neat hack to Bool_Array, suggested by rfg.
  657.           The basic idea was to throw away the Ullman array technique.
  658.           The Ullman array was used to remove the need to reinitialize all 
  659.           the Bool_Array elements to zero everytime we needed to determine
  660.           whether there were duplicate hash values in the keyword list.  
  661.           The current trick uses an `iteration number' scheme, which takes
  662.           about 1/3 the space and reduces the overall program running a 
  663.           time by about 20 percent for large input!  The hack works as 
  664.           follows:
  665.           
  666.           1. Dynamically allocation 1 boolean array of size k.
  667.           2. Initialize the boolean array to zeros, and consider the first
  668.              iteration to be iteration 1.
  669.           2. Then on all subsequent iterations we `reset' the bool array by
  670.              kicking the iteration count by 1. 
  671.           3. When it comes time to check whether a hash value is currently
  672.              in the boolean array we simply check its index location.  If
  673.              the value stored there is *not* equal to the current iteration
  674.              number then the item is clearly *not* in the set.  In that
  675.              case we assign the iteration number to that array's index
  676.              location for future reference.  Otherwise, if the item at
  677.              the index location *is* equal to the iteration number we've
  678.              found a duplicate.  No muss, no fuss!
  679.              
  680. Mon Oct  2 12:30:54 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  681.  
  682.         * Changed some consts in options.h to enumerals, since g++
  683.           doesn't seem to like them at the moment!
  684.  
  685. Sat Sep 30 12:55:24 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  686.  
  687.         * Fixed a stupid bug in Key_List::print_hash_function that manifested
  688.           itself if the `-k$' option was given (i.e., only use the key[length]
  689.           character in the hash function).
  690.  
  691.         * Added support for the -C option.  This makes the contents of
  692.           all generated tables `readonly'.
  693.  
  694.         * Changed the handling of generated switches so that there is
  695.           only one call to str[n]?cmp.  This *greatly* reduces the size of
  696.           the generated assembly code on all compilers I've seen.
  697.  
  698.         * Fixed a subtle bug that occurred when the -l and -S option
  699.           was given.  Code produced looked something like:
  700.  
  701.           if (len != key_len || !strcmp (s1, resword->name)) return resword;
  702.  
  703.           which doesn't make any sense.  Clearly, this should be:
  704.  
  705.           if (len == key_len && !strcmp (s1, resword->name)) return resword;
  706.  
  707. Tue Sep 26 10:36:50 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  708.  
  709.         * Changed class Read_Line's definition so that it no longer
  710.           needs to know about the buffering scheme used to speed up 
  711.           dynamic memory allocation of input keywords and their
  712.           associated attributes.  This means that operator new is no longer
  713.           a friend of Read_Line.
  714.  
  715. Mon Sep 25 23:17:10 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  716.  
  717.         * Decided that Obstacks had too much overhead, so they were
  718.           removed in favor of super-efficient, low-overhead buffered
  719.           storage allocation hacks in Read_Line and List_Node.
  720.  
  721.         * No longer try to inline functions that g++ complains about
  722.           (Key_List::Merge and Key_List::Merge_Sort).
  723.  
  724. Sun Sep 24 13:11:24 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  725.  
  726.         * Changed classes Read_Line and List_Node to use Obstacks in order
  727.           to cache memory allocation for keyword strings and List_Nodes.
  728.           
  729.         * Continued to experiment with inheritance schemes.
  730.         
  731.         * Added a new file `alpha.h', that declares static data shared
  732.           (i.e., inherited) between classes List_Node and Key_List.
  733.  
  734. Tue Sep 12 16:14:41 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  735.  
  736.         * Made numerous changes to incorporate multiple inheritance in 
  737.           gperf.
  738.  
  739. Wed Aug 16 23:04:08 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  740.  
  741.         * Added the -DCOMPILER_FIXED flag to the ./src/Makefile.  This
  742.           implies that people trying to compile gperf need to have a
  743.           working version of the new g++ compiler (1.36.0).
  744.  
  745.         * Removed some extra spaces that were being added in the generated
  746.           C code.
  747.  
  748. Mon Jul 24 17:09:46 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  749.  
  750.         * Fixed PRINT_HASH_FUNCTION and PRINT_LOOKUP_FUNCTION in keylist.c
  751.           so that the generated functions take an unsigned int length argument.
  752.           If -a is enabled the prototype is (const char *str, size_t len).
  753.  
  754. Fri Jul 21 13:06:15 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
  755.  
  756.         * Fixed a typo in PRINT_KEYWORD_TABLE in keylist.cc that prevented
  757.           the indentation from working correctly.
  758.  
  759.         * Fixed a horrible typo in PRINT_KEYWORD_TABLE in keylist.cc
  760.           that prevented links from being printed correctly.
  761.  
  762. Tue Jul 18 16:04:31 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
  763.  
  764.         * Fixed up readline.cc and readline.h so that they work OK
  765.           with g++ compilers that aren't completely up-to-date.
  766.           If symbol COMPILER_FIXED is defined then the behavior
  767.           that works on my more recent version of g++ is enabled.
  768.  
  769. Sun Jul  9 17:53:28 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  770.  
  771.         * Changed the ./tests subdirectory Makefile so that it 
  772.           uses $(CC) instead of gcc.
  773.  
  774. Sun Jul  2 21:52:15 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  775.  
  776.         * Fixed a number of subtle bugs that occurred when -S was
  777.           combined with various and sundry options.
  778.  
  779.         * Added the -G option, that makes the generated keyword table
  780.           a global static variable, rather than hiding it inside
  781.           the lookup function.  This allows other functions to directly
  782.           access the contents in this table.
  783.  
  784.         * Added the "#" feature, that allows comments inside the keyword
  785.           list from the input file. Comment handling takes place in readline.c.  
  786.           This simplifies the code and reduces the number of malloc calls.
  787.           
  788.         * Also added the -H option (user can give the name of the hash
  789.           function) and the -T option (prevents the transfer of the type decl
  790.           to the output file, which is useful if the type is already defined
  791.           elsewhere).
  792.  
  793. Thu Jun 22 20:39:39 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  794.  
  795.         * Modified many classes so that they would inherit Std_Err as
  796.           a base class.  This makes things more abstract...
  797.  
  798. Fri Jun 16 14:23:00 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
  799.  
  800.         * Modified the -f (FAST) option.  This now takes an argument.
  801.           The argument corresponds to the number of iterations used
  802.           to resolve collisions.  -f 0 uses the length of the
  803.           keyword list (which is what -f did before).  This makes
  804.           life much easier when dealing with large keyword files.
  805.  
  806. Tue Jun  6 17:53:27 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  807.  
  808.         * Added the -c (comparison) option.  Enabling this
  809.           will use the strncmp function for string comparisons.
  810.           The default is to use strcmp.
  811.  
  812.         * Fixed a typo in key_list.cc (PRINT_SWITCH).  This caused
  813.           faulty C code to be generated when the -D, -p, and -t
  814.           options were all enabled.
  815.  
  816. Thu May 25 14:07:21 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
  817.  
  818.         * Once again, changed class Read_Line to overload global operator
  819.           new.  Hopefully, this will work...!
  820.  
  821. Sun May 21 01:51:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  822.  
  823.         * Modified Key_List::print_hash_function () so that it properly
  824.           formats the associated values in the hash table according to
  825.           the maximum number of digits required to represent the largest
  826.           value.
  827.  
  828.         * Removed the named return value from class Hash_Table's
  829.           operator (), since this causes a seg fault when -O is enabled.
  830.           No sense tripping subtle g++ bugs if we don't have to.... ;-)
  831.  
  832.         * Removed the operator new hack from Read_Line, since this seemed
  833.           to create horrible bus error problems.
  834.                     
  835.         * Changed many class member functions and data members to be `static', 
  836.           if they don't manipulate this!
  837.           
  838. Fri May 12 23:06:56 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  839.  
  840.         * Changed class Std_Err to use static member functions, a la
  841.           Ada or Modula 2.  This eliminates the need for an explicit
  842.           error-handler class object.
  843.  
  844.         * Added the ``named return value'' feature to Hash_Table::operator ()
  845.           and Bool_Array::operator [], just for the heck of it.... ;-)
  846.  
  847.         * Changed the previous hack in Read_Line so that we now use
  848.           the overloaded global `new' instead of NEW_STRING!
  849.  
  850. Wed May  3 17:36:55 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
  851.  
  852.         * Updated to version 1.7.  This reflects the recent major changes
  853.           and the new C port.
  854.  
  855.         * Modified the GNU getopt.cc routine to have a class-based interface.
  856.  
  857.         * Fixed a typo in Perfect.cc ~Perfect that prevented the actual maximum
  858.           hash table size from being printed (maybe the stream classes
  859.           weren't so bad after all.... ;-).
  860.  
  861.         * Added support for the -f option.  This generates the perfect
  862.           hash function ``fast.''  It reduces the execution time of
  863.           gperf, at the cost of minimizing the range of hash values.
  864.  
  865. Tue May  2 16:23:29 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  866.  
  867.         * Added an efficiency hack to Read_Line.  Instead of making
  868.           a call to operator NEW (a.k.a. malloc) for each input string
  869.           a new member function NEW_STRING stores a large buffer from
  870.           which new strings are carved out, growing the buffer if
  871.           necessary.  It might be useful to add this throughout the
  872.           program....
  873.  
  874.         * Removed all unnecessary calls to DELETE.  If the program is about
  875.           to exit it is silly to waste time freeing memory.
  876.  
  877.         * Added the GNU getopt program to the distribution.  This makes
  878.           GPERF portable to systems that don't include getopt in libc.
  879.           
  880.         * Added a strcspn member to class Key_List.  This also increases
  881.           portability.
  882.  
  883.         * Added the get_include_src function from keylist.c as a member
  884.           function in class Key_List.  Hopefully every function is 
  885.           now associated with a class.  This aids abstraction and
  886.           modularity.
  887.  
  888.         * Ported gperf to C.  From now on both K&R C and GNU G++ versions
  889.           will be supported.  There will be two ChangeLog files, one
  890.           for each version of the program.
  891.  
  892. Mon May  1 16:41:45 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  893.  
  894.         * Fixed a bug with -k'*'.  This now prints out *all* the cases
  895.           up to the length of the longest word in the keyword set.
  896.  
  897. Sun Apr 30 12:15:25 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  898.  
  899.         * Removed all use of the stream classes.  Too ugly, slow, and
  900.           not handled by the c++-mode formatter....
  901.  
  902.         * Modified the handling of links (i.e., keywords that have
  903.           identical hash values as other keywords).  This should 
  904.           speed up hash function generation for keyword sets with
  905.           many duplicate entries.  The trick is to treat duplicate
  906.           values as equivalence classes, so that each set of duplicate
  907.           values is represented only once in the main list processing.
  908.  
  909.         * Fixed some capitialization typos and indentations mistakes in 
  910.           Key_List::print_hash_function.
  911.  
  912. Sat Apr 29 12:04:03 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
  913.  
  914.         * Fixed a typo/logico in Key_List::print_switch that prevented
  915.           the last keyword in the keyword list to be print out.  This
  916.           requires further examination.....
  917.  
  918.         * Fixed a stupid bug in List_Node::List_node.  If the -k'*' option
  919.           was enabled the KEY_SET string wasn't getting terminated with
  920.           '\0'!
  921.  
  922. Fri Apr 28 12:38:35 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  923.  
  924.         * Renamed strexp.h and strexp.cc to iterator.h and iterator.cc.
  925.           Also changed the strexp class to iterator.  Continued to work
  926.           on style...
  927.  
  928.         * Updated the version number to 1.6.  This reflects all the 
  929.           recent changes.
  930.  
  931. Thu Apr 27 00:14:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  932.  
  933.         * Added the -D option that properly handles keyword sets that
  934.           contain duplicate hash values.
  935.  
  936.         * Continued the stylistic changes.  Added the #pragma once
  937.           directive to all the *.h files.  Removed all #defines and
  938.           replaced them with static consts.  Also moved the key_sort
  939.           routine from options.cc into the options class as a 
  940.           member function.
  941.  
  942. Mon Apr  3 13:26:55 1989  Doug Schmidt  (schmidt at zola.ics.uci.edu)
  943.  
  944.         * Made massive stylistic changes to bring source code into
  945.           conformance with GNU style guidelines.
  946.  
  947. Thu Mar 30 23:28:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  948.  
  949.         * Fixed up the output routines so that they generate code
  950.           corresponding to the GNU style guidelines.
  951.  
  952. Sat Mar 11 13:12:37 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  953.  
  954.         * Fixed Stderr constructors so that they wouldn't try to
  955.           use the base class initializer syntax for the static 
  956.           class variable Program_Name.  G++ 1.34 is stricter in
  957.           enforcing the rules!
  958.  
  959. Fri Mar 10 11:24:14 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  960.  
  961.         * Removed -v and ``| more'' from the Makefile to keep rfg happy...
  962.  
  963. Thu Mar  2 12:37:30 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  964.  
  965.         * Sent latest GNU gperf version 1.5 to Doug Lea for inclusion
  966.           into libg++ 1.34.  Note that there is a small bug with
  967.           the new %{ ... %} source inclusion facility, since it doesn't
  968.           understand comments and will barf if %{ or %} appear nested
  969.           inside the outermost delimiters.  This is too trivial of
  970.           a defect to fix at the moment...
  971.  
  972. Tue Feb 28 11:19:58 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  973.  
  974.         * Added the -K option, which allows the user to provide a
  975.           alternative name for the keyword structure component.
  976.           The default is still ``name.''
  977.  
  978.         * Added the LEX and YACC-like ability to include arbitrary
  979.           text at the beginning of the generated C source code output.
  980.           This required two new functions Get_Special_Input, 
  981.           Key_List::Save_Include_Src;
  982.  
  983.         * Fixed memory allocation bug in Key_List::Set_Types.
  984.           Variable Return_Type needs 1 additional location
  985.           to store the "*" if the -p option is used.
  986.           
  987.         * Added code to NULL terminate both Struct_Tag and Return_Type,
  988.           *after* the strncpy (stupid mistake).
  989.           
  990. Mon Feb 27 14:39:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  991.  
  992.         * Added a new option -N.  This allows the user to specify the
  993.           name to be used for the generated lookup function.  The
  994.           default name is still ``in_word_set.''  This makes it
  995.           possible to completely automate the perfect hash function
  996.           generation process!
  997.  
  998. Mon Feb 20 23:33:14 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  999.  
  1000.         * Corrected the Hash_Table::operator () function so that
  1001.           *it* is responsible for deciding when a new key has the
  1002.           same signature as a previously seen key.  The key length 
  1003.           information is now used internally to this function to
  1004.           decide whether to add to the hash table those keys with
  1005.           the same key sets, but different lengths.  Before, this
  1006.           was handled by the Key_List::Read_Keys function.  However,
  1007.           this failed to work for certain duplicate keys, since
  1008.           they weren't being entered into the hash table properly.
  1009.  
  1010. Sun Feb 19 16:02:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  1011.  
  1012.         * Modified class Options by moving the enum Option_Type out
  1013.           of the class.  This is to satisfy the new enumeration
  1014.           scope rules in C++.
  1015.  
  1016. Sun Jan 15 15:12:09 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  1017.  
  1018.         * Incremented the version number upto 1.4 to reflect the new 
  1019.           options that affect the generated code.  Send the new 
  1020.           distribution off to Michael for use with g++ 1.33.
  1021.  
  1022.         * Added a fix to Key_List::Read_Keys so that it checks for links
  1023.           properly when the -n option is used.  Previously, it didn't
  1024.           catch obvious links, which caused it to spend large amount
  1025.           of time searching for a solution that could never occur!
  1026.  
  1027.         * Modified the Key_List data structure to record *both* the 
  1028.           minimum and the maximum key lengths.  This information
  1029.           is now computed in Key_List::Read_Keys, and thus 
  1030.           Key_List::Print_Min_Max doesn't need to bother.
  1031.  
  1032.         * Modifed the key position iterator scheme in options.cc to
  1033.           eliminate the need for member function Options::Advance.
  1034.           Now, the Options::Get function performs the advancement
  1035.           automatically, obviating the need for an extra function call.
  1036.  
  1037.         * Added the new function Options::Print_Options, to print out
  1038.           the user-specified command line options to generated C
  1039.           output file.
  1040.  
  1041.         * Added a new function, Key_List::Print_Keylength_Table,
  1042.           which creates a table of lengths for use in speeding
  1043.           up the keyword search.  This also meant that a new
  1044.           option, -l (LENTABLE) is recognized.  It controls 
  1045.           whether the length table is printed and the comparison
  1046.           made in the generated function ``in_word_set.''
  1047.  
  1048.         * Added a comment at the top of the generated C code
  1049.           output file that tells what version of gperf was used.
  1050.           Next, I'll also dump out the command line options
  1051.           as a comment too.  Thanks to Michael Tiemann for the
  1052.           feedback on this.
  1053.  
  1054.         * Fixed the -n option to make it work correctly with
  1055.           other parts of the program (most notably the Perfect::Hash
  1056.           function and the computation of minimum and maximum lengths.
  1057.  
  1058. Fri Jan 13 21:25:27 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
  1059.  
  1060.         * Realized the the need to add a test that will enable
  1061.           optimziation of the generated C code in the ``hash'' function
  1062.           by checking whether all the requested key positions are
  1063.           guaranteed to exist due to the comparison in `in_word_set.''
  1064.           I'll put this in soon....
  1065.  
  1066. Thu Jan 12 20:09:21 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  1067.  
  1068.         * Added pascal, modula3, and modula2 tests inputs to the 
  1069.           Makefile
  1070.         
  1071.         * Recognised that there is a bug with the -n option.  However
  1072.           I'm too busy to fix it properly, right now.  The problem 
  1073.           is that the generated #define end up being 0, since that's
  1074.           my hack to make -n work.  This needs complete rethinking!
  1075.  
  1076. Tue Jan 10 00:08:16 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  1077.  
  1078.         * Added a new option, -n, that instructs gperf to not use the
  1079.           length of an identifier when computing the hash functions.
  1080.           I'm not sure how useful this is!
  1081.           
  1082.         * Retransmitted the distribution to rocky.oswego.edu.  Hopefully,
  1083.           this will work!
  1084.  
  1085.         * Began fixing the indentation and capitalization to conform
  1086.           to the GNU coding guidelines.
  1087.  
  1088. Mon Jan  9 22:23:18 1989  Doug Schmidt  (schmidt at pompe.ics.uci.edu)
  1089.  
  1090.         * Fixed horrible bug in Read_Line::Readln_Aux.  This was
  1091.           a subtle and pernicous off-by-1 error, that overwrote
  1092.           past the last character of the input string buffer.  I
  1093.           think this fault was killing the vax!
  1094.  
  1095.         * Yow, fixed an oversight in List_Node::List_Node, where the
  1096.           pointer field Next was uninitialized.  Luckily, the new routine
  1097.           seems to return 0 filled objects the first time through!
  1098.  
  1099. Sun Jan  8 13:43:14 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  1100.  
  1101.         * Modified the ``key linked'' diagnostic in Key_List::Read_Keys
  1102.           to be more helpful and easy to read.
  1103.  
  1104.         * Fixed the List_Node::List_Node so that it would ignore trailing
  1105.           fields if the -t option was not enabled.
  1106.  
  1107.         * Moved the List_Node declarations out of keylist.h and
  1108.           into a file of its own, called listnode.cc and listnode.h
  1109.           Made Set_Sort a member function of class List_Node.
  1110.  
  1111.         * Massively updated the documentation in the gperf.texinfo file.
  1112.         
  1113.         * Polished off the major revision to the print functions,
  1114.           added a few new tests in the Makefile to check for the
  1115.           validity of the program and ftp'ed the entire distribution
  1116.           off to Doug Lea for libg++. ( changed it to
  1117.           1.3 to reflect the major changes with the generated
  1118.           C code ).
  1119.  
  1120.         * Fixed Key_List::Print_Switch to deal with the -p and -t options.
  1121.           This meant that the ``still-born'' function Key_List::
  1122.           Print_Type_Switch was superflous, so I removed it.
  1123.           Also, removed the restriction in Option that the -p and
  1124.           -t options couldn't be used simultaneously.
  1125.  
  1126.         * Modified List_Node::List_Node, to perform only 1 call to 
  1127.           ``new'' when dynamically allocating memory for the Key_Set
  1128.           and the Uniq_Set.
  1129.  
  1130. Sat Jan  7 14:10:51 1989  Doug Schmidt  (schmidt at glacier.ics.uci.edu)
  1131.  
  1132.         * Fixed a big bug with the new policy of nesting the
  1133.           wordlist inside of generated function ``in_word_set.''
  1134.           I'd forgotten to declare the wordlist array as static!
  1135.           ( arrgh ).
  1136.  
  1137.         * Added a new function Key_List::Set_Types, that figures out
  1138.           the return type for generated function ``in_word_set,''
  1139.           the user-defined ``struct tag,'' if one is used, and also
  1140.           formates the array type for the static local array.
  1141.  
  1142.         * Changed the print routines to take advantage of the
  1143.           new -p option.
  1144.  
  1145.         * Began adding the hooks to allow the return of a pointer
  1146.           to a user defined struct location from the generated
  1147.           ``in_word_set'' function instead of the current 0 or 1
  1148.           return value.  Created function Key_List::Print_Type_Switch
  1149.           and added option -p to class Option, allowing the user to 
  1150.           request generation of the aforementioned pointers returned 
  1151.           instead of booleans.
  1152.  
  1153.         * Put in checks in class Option to make sure that -S and -t
  1154.           options are not used simultaneously.  This restriction
  1155.           will be removed in subsequent releases, once I decide on
  1156.           a clean way to implement it.
  1157.  
  1158.         * Sent version 1.2 to Doug Lea for possible inclusion into
  1159.           the libg++ distribution.
  1160.           
  1161.         * Moved the static word_list array inside the generated function
  1162.           in_word_set.  This supports better data hiding.
  1163.  
  1164.         * Added a texinfo file, gperf.texinfo
  1165.           
  1166.         * Revised the Makefile to cleanup the droppings from texinfo
  1167.           and changed the name of gperf.cc and gperf.h to perfect.cc
  1168.           and perfect.h.
  1169.  
  1170. Fri Jan  6 13:04:45 1989  Doug Schmidt  (schmidt at crimee.ics.uci.edu)
  1171.  
  1172.         * Implemented the switch statement output format.  Much better
  1173.           for large datasets in terms of space used.
  1174.  
  1175.         * Added new functions to break up the Key_List::Output function.
  1176.           Functions added were Key_List::Print_Switch, Key_List::Print_Min_Max,
  1177.           Key_List::Print_Keyword_Table, Key_List::Print_Hash_Function,
  1178.           and Key_List::Print_Lookup_Function.  This simplifies the
  1179.           big mess in Key_List::Output considerably!
  1180.           
  1181.         * Added switch statement option to Options, which potentially 
  1182.           trades time for space in the generated lookup code.
  1183.  
  1184. Thu Jan  5 22:46:34 1989  Doug Schmidt  (schmidt at siam.ics.uci.edu)
  1185.  
  1186.         * Released version 1.1
  1187.         
  1188.         * Fixed a bug with Gperf::Merge_Set, it was skipping letters shared
  1189.           between the Set_1 and Set_2.
  1190.  
  1191.         * Added the optimal min/max algorithm in Key_List::Output.  This
  1192.           runs in O ( 3n/2 ), rather than O ( 2n ) time.
  1193.  
  1194.         * Changed Gperf::Sort_Set to use insertion sort, rather than
  1195.           bubble sort.
  1196.         
  1197.         * Added a check in Key_List::Output for the special case where
  1198.           the keys used are 1,$.  It is possible to generate more
  1199.           efficient C code in this case.
  1200.